import createIatRecorder from 'kdxf-web';
import {
	mapGetters,
	mapMutations
} from 'vuex';
const config = {
	hostUrl: "wss://iat-api.xfyun.cn/v2/iat", //WebSocket服务地址
	host: "iat-api.xfyun.cn", //主机名
	appid: "1d450eb0", //科大讯飞应用ID
	apiSecret: "MjA3ZTNiMTIzZjE3ZDJkNGNkOTRkNTli", //科大讯飞API密钥
	apiKey: "6b60bf4485792b32cc012636bfd8efc8", //科大讯飞API密钥
	uri: "/v2/iat" //API路径
};
/*
工作原理: 
1. 初始化录音设备和WebSocket连接
2. 采集用户麦克风的音频数据
3. 对音频数据进行必要的预处理（重采样到16kHz）
4. 通过WebSocket发送音频数据到科大讯飞服务器
5. 接收并处理服务器返回的识别结果
6. 触发相应回调函数通知应用程序

注意事项:
1. 使用前需要在科大讯飞开放平台注册并创建应用，获取相应的appid、apiKey和apiSecret
2. 确保用户允许浏览器访问麦克风，否则将无法进行录音
3. 该模块依赖Web Audio API和WebSocket API，确保使用的浏览器支持这些功能
4. 每次使用完毕后应调用recorderStop()方法释放资源
5. 默认最大录音时间为60秒，超时将自动停止
*/
export default {
	name: 'iflyYunService',
	data() {
		return {}
	},
	computed: {
		...mapGetters('app', ['iatRecorder']),
	},
	methods: {
		...mapMutations('app', ['setIatRecorder']),
		//初始化录音实例资源
		getRecorderIns() {
			return this.iatRecorder;
		},
		async initRecorder() {
			return new Promise(resolve => {
				console.log('初始化实时语言转写');
				let iatRecorder = createIatRecorder(config)
				this.setIatRecorder(iatRecorder)
				//当识别文本变化时触发
				this.iatRecorder.onTextChange = (text) => {
					console.log('当前识别文本: ', text)
					uni.$emit('XUNFEI_TEXT_CHANGE', text)
				};
				//当语音识别完成时触发
				this.iatRecorder.onRecognitionComplete = (text) => {
					console.log('识别完成: ', text)
					uni.$emit('XUNFEI_TEXT_COMPLETED', text)
				};
				//当状态即将改变时触发: 录音器有以下几种状态 null:未开始录音  ing:录音中  end:录音结束
				this.iatRecorder.onWillStatusChange = (oldStatus, newStatus) => {
					console.log(`状态从 ${oldStatus} 变为 ${newStatus}`)
				};
				resolve(true)
			})
		},
		// 开始录音并识别
		startRecordTask() {
			console.log('开始实时语言转写')
			this.iatRecorder.start()
		},
		// 停止录音
		stopRecordTask() {
			console.log('停止实时语言转写')
			this.iatRecorder.stop()
		},
		// 完全停止录音并释放所有资源
		releaseRecorder() {
			console.log('释放实时语言转写')
			this.iatRecorder.recorderStop()
			this.setIatRecorder(null)
		}
	}
}